stat & fstat [system call]

프로세스마다 PID가 존재하고 해당 프로세스의 정보가 담긴 PCB가 존재한다.(메모리에 업로드 되어 있음)
프로세스와 유사한 시스템이 파일에도 적용되어 있다.

파일마다 고유한 inode가 존재하고 각각의 inode에 대응하는 inode 구조체가 있다.
The EXT2 Inode
mode 파일 종류/권한(root)
inode 메타 데이터-stat 함수
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char* path, struct stat* buf);
int fstat(int filedes, struct stat* buf);
stat은 파일의 이름(주소 포함)을 입력으로 받고 fstat은 파일 디스크립트를 입력으로 받는다.
fopen, read, write 등 기본 파일 시스템콜도 기억할 것!
stat struct
struct stat{
dev_t st_dev; // ID of device containing file
ino_t st_ino; // inode number
mode_t st_mode; //
nlink_t st_nlink; // hardlink
uid_t st_uid; // owner
gid_t st_gid; // group ID of owner
dev_t st_rdev; // device IP (if special file)
off_t st_size; // (bytes)
blksize_t st_blksize; // blocksize for file system I/O
blkcnt_t st_blocks; // number of 512B blocks allocated
time_t st_atime; // time of last access
time_t st_mtime; // time of modification
time_t st_ctime; // time of last status change
};
참고: 가상 파일 시스템 -st_dev
디스크와 같은 스토리지도 디렉토리 형태로 사용하지만, 실제 디렉토리는 서로 달리하여 사용 가능 -st_dev
stat_test.c
#include <stdio.h>
#include <sys/stat.h>
int main(void){
int ret=0;
struct stat buf;
ret=stat("stat_test.txt", &buf);
if(ret<0){
printf("ERROR\n");
return 0;
}
printf("deviceI[%d], inodenum[%llu], hardlinkcount[%hu], filesize[%lld], blocksize[%d], blockcount[%lld] \n", buf.st_dev, buf.st_ino, buf.st_nlink, buf.st_size, buf.st_blksize, buf.st_blocks);
return 0;
}

deviceI[16777232], inodenum[20835549], hardlinkcount[1], filesize[30], blocksize[4096], blockcount[8] 

파일 사이즈는 보통 자신이 차지하는 영역에 추가적으로 공간을 예약적으로 가지고 있다.
블럭 카운트는 추가적인 영역을 제외하고 계산
위에서 블록은 4KB 크기를 가지고 있으며, 8개의 블록이 사용되었다.